# -*- coding: utf-8 -*-
# 操作内容：
# @Software: PyCharm
# @File: keywords_util.py
# @Author: 一碗好酒（张智）
# @E-mail: 1473658931@qq.com, 
# @Time: 7月 21, 2021
# ---

import pandas

# 存储所有的变量信息
import pymysql

from setting import DIR_NAME

globals_variables = {}
# 说去所有的api信息
apis = {}  # api的名字，


# 获取所有的变量的值
def get_global_variables():
    res = pandas.read_excel(DIR_NAME + '/data/mtxshop_keywords.xlsx',
                            sheet_name='全局变量',
                            keep_default_na=False,
                            engine='openpyxl'
                            )
    # 获取所有的行
    row_count = res.shape[0]
    for row in range(row_count):
        key = res.iloc[row, 0]  # 获取到变量
        value = res.iloc[row, 1]
        globals_variables[key] = value  # 将信息放到全局字典中
    # for k in globals_variables.keys():
    #     print(k,end="    get_global_variables\n")


# 获取所有api的值
def get_api_infos():  #获取到字典套列表
    '''
    {"api名字-登录接口":[url,method,headers,参数]}
    :return:
    '''
    res = pandas.read_excel(DIR_NAME + '/data/mtxshop_keywords.xlsx',
                            sheet_name='单接口',
                            keep_default_na=False,
                            engine='openpyxl'
                            )
    # 获取所有的行
    row_count = res.shape[0]
    col_count = res.columns.size  # 列数
    for row in range(row_count):
        # api的名字
        api_name = res.iloc[row, 0]
        # 定义列表存储接口信息
        api_info_list = []
        for col in range(1, col_count):
            text = res.iloc[row, col]
            api_info_list.append(text)
        apis[api_name] = api_info_list
    print(apis)


# 获取所有要执行的测试用例
def get_all_cases():
    res = pandas.read_excel(DIR_NAME + '/data/mtxshop_keywords.xlsx',
                            sheet_name='测试用例集合',
                            keep_default_na=False,
                            engine='openpyxl'
                            )
    # 获取所有的行
    row_count = res.shape[0]
    # ['执行测试用例1'，'执行测试用例2'，'执行测试用例3']
    cases_list = []
    for row in range(row_count):
        if res.iloc[row, 1].lower() == 'y':  # 细节：lower进行兼容判断
            cases_list.append(res.iloc[row, 0])

    return cases_list


# 获取测试用例里api里面的每个接口信息，然后保存到字典中。
def get_cases_infos(casename):   #字典套列表
    '''

    :param casename: 测试用例的名字-sheet页的名字
    :return:  {'casename':[
    [接口1的所有信息-url，method，headers，参数，响应提取，状态码断言，响应的断言，数据库断言，用例参数]，
    [接口2的所有的信息]
    ]
    }
    '''
    res = pandas.read_excel(DIR_NAME + '/data/mtxshop_keywords.xlsx',
                            sheet_name=casename,
                            keep_default_na=False,
                            engine='openpyxl'
                            )
    # 获取所有的行
    row_count = res.shape[0]
    col_count = res.columns.size
    # 定义一个字典
    cases_info = {}
    # 存储需要调用的接口所有的信息
    steps = []
    for row in range(row_count):
        api_name = res.iloc[row, 0]
        api_infos = apis[api_name]
        for col in range(1, col_count):
            api_infos.append(res.iloc[row, col])  # apiinfo包含响应的内容
        steps.append(api_infos)
    cases_info[casename] = steps
    return cases_info

#封装数据库
class DB:
    def __init__(self,db_env):

        # 链接数据库
        self.db = pymysql.connect(
            host=globals_variables['dbip'],
            port=globals_variables['dbport'],
            user=globals_variables['dbusername'],
            password=sglobals_variables['dbpwd'],
            charset='utf8mb4',
            #返回数据类型-字典
            cursorclass=pymysql.cursors.DictCursor
        )
    #查询 返回数据
    def select(self,sql):
        '''

        :param sql: 原生sql语句
        :return:
        '''
        # 创建游标
        cursor = self.db.cursor()
        cursor.execute(sql)
        data = cursor.fetchall() # 获取所有查询到的数据
        self.db.commit()  # 不提交的话，一次或者多次查询可能会有问题
        cursor.close()
        return data
    #增加 ，删除， 修改
    def update(self,sql):
        '''

        :param sql: 修改删除，增加语句。
        :return:
        '''
        cursor = self.db.cursor()
        cursor.execute(sql)
        self.db.commit()  # 更新语句一定要提交。
        cursor.close()

    def close(self):
        '''
        对数据库进行关闭
        :return:
        '''
        if self.db != None:
            self.db.close()

if __name__ == '__main__':
    # get_api_infos()
    # print(get_cases_infos('立即购买成功'))
    # print(get_cases_infos('立即购买-数量为空'))
    #调用存储变量的喊
    # print("全局变量--字典")
    # get_global_variables()
    # print(globals_variables)
    # print("全局变量--字典")
    #
    # print('api信息')
    # get_api_infos()
    # print('api信息')
    #
    # print("获取用例信息")
    # print(get_cases_infos('立即购买成功'))
    # print("获取用例信息")
    # 获取所有测试用例
    all_cases = get_all_cases()
    print(all_cases)
    # 获取全景变量
    print("全景变量")
    get_global_variables()
    print(globals_variables)
    #获取单接口信息
    print('获取单接口信息')
    get_api_infos()
    print(apis)
    print('获取单个测试用例测试信息')
    print(get_cases_infos('立即购买成功'))